/*
 * Archivo.java
 *
 * Created on 17/12/2007, 10:43:01 AM
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ia;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;

/**
 *
 * @author Manuel Avalos
 * @author Arturo Ferreira
 * 
 */
/**
 *
 * Esta clase es utilizada para llevar a cabo la lectura de los datos de entrada.
 *
 */
public class Archivo {

    private int poblacion = 0; //Contendra el numero de individuos de la poblacion.
    private int activos = 0; //Contendra el numero de activos o lugares en los cuales se debe llevar a cabo la distribucion.    
    private double [][] covarianza = null;
    private double [] rendimiento = null;

    /**
     *
     * Constructor por defecto de la clase Archivo
     *
     */
    public Archivo() {
    }

    /**
     *
     * Metodo utilizado para la lectura del archivo que contiene los datos.
     * @param path Direcion en donde se encuentra el archivo con los datos de entrada.     
     * @throws Exception Se lanza una excepcion si ocurre un error durante la lectura de los
     * datos de entrada.
     *
     */
    public void leer(String path) throws Exception {
        FileReader fr_path;
        StringTokenizer tokens;
        BufferedReader br_path;
        String linea;     
        int posicion = 0;
        double valor = 0;
        int fila = 0;
        int columna = 0;
        //Se inicia la lecyura de los datos
        try {
            fr_path = new FileReader(path);
            br_path = new BufferedReader(fr_path);
            
            //Empieza la lectura de las covarianza. 
            while ((linea = br_path.readLine()) != null) {
                if (!linea.startsWith("#")) {
                    if(linea.startsWith("Poblacion:")){
                        tokens=new StringTokenizer(linea, " ");
                        tokens.nextToken();
                        this.poblacion = Integer.parseInt(tokens.nextToken());
                    }
                    
                    if(linea.startsWith("Number_of_assets:")){
                        tokens=new StringTokenizer(linea, " ");
                        tokens.nextToken();
                        this.activos= Integer.parseInt(tokens.nextToken());
                        rendimiento = new double [this.activos];
                        covarianza = new double [this.activos][this.activos];
                    }
                    
                    if(linea.startsWith("Asset",0)){
                        tokens=new StringTokenizer(linea, " ");
                        tokens.nextToken();
                        posicion = Integer.parseInt(tokens.nextToken()) - 1;
                        valor = Double.parseDouble(tokens.nextToken());
                        rendimiento[posicion] = valor;
                    }
                    
                    if(linea.startsWith("Covariance")){
                        tokens=new StringTokenizer(linea, " ");
                        tokens.nextToken();
                        fila = Integer.parseInt(tokens.nextToken()) - 1;
                        columna = Integer.parseInt(tokens.nextToken()) - 1;
                        valor = Double.parseDouble(tokens.nextToken());
                        covarianza[fila][columna] = valor;
                    }
                }
                    
            }
            //Se cierra el archivo.
            br_path.close();
            fr_path.close();
        } catch (Exception e) {
            e.printStackTrace();
        }        
    }

    public int getActivos() {
        return activos;
    }

    public double[][] getCovarianza() {
        return covarianza;
    }

    public int getPoblacion() {
        return poblacion;
    }

    public double[] getRendimiento() {
        return rendimiento;
    }

    public void setActivos(int activos) {
        this.activos = activos;
    }

    public void setCovarianza(double[][] covarianza) {
        this.covarianza = covarianza;
    }

    public void setPoblacion(int poblacion) {
        this.poblacion = poblacion;
    }

    public void setRendimiento(double[] rendimiento) {
        this.rendimiento = rendimiento;
    }
    
    public void imprimirCovarianza() {
        
        System.out.flush();
        
        for (int i = 0; i < this.activos; i++) {
            for (int j = 0; j < this.activos; j++) {
                System.out.print(covarianza[i][j] + "\t");
            }
            System.out.println();
        }
        System.out.println();
    }
    
    public void imprimirRendimientos() {
        
        System.out.flush();
        
        for (int i = 0; i < this.activos; i++) {
            System.out.print(rendimiento[i] + "\t");
        }
        System.out.println();
    }
}